import abc


class Car(object):
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def car_run(self, *args, **kwargs):
        pass

    @abc.abstractmethod
    def car_turn(self, *args, **kwargs):
        pass

    @abc.abstractmethod
    def car_stop(self, *args, **kwargs):
        pass


class Ford(Car):
    def __init__(self):
        self.type = "ford"

    def car_run(self):
        print("%s is running" % self.type)

    def car_turn(self):
        print("%s is turning" % self.type)

    def car_stop(self):
        print("%s is stopping" % self.type)


class Buick(Car):
    def __init__(self):
        self.type = "buick"

    def car_run(self):
        print("%s is running" % self.type)

    def car_turn(self):
        print("%s is turning" % self.type)

    def car_stop(self):
        print("%s is stopping" % self.type)


class Cadillac(Car):
    def __init__(self):
        self.type = "cadillac"

    def car_run(self):
        print("%s is running" % self.type)

    def car_turn(self):
        print("%s is turning" % self.type)

    def car_stop(self):
        print("%s is stopping" % self.type)


class AutoSystem(object):

    def __init__(self, car: Car):
        self.car = car

    def car_run(self):
        self.car.car_run()

    def car_turn(self):
        self.car.car_turn()

    def car_stop(self):
        self.car.car_stop()


if __name__ == "__main__":
    ford = Ford()
    buick = Buick()
    cadillac = Cadillac()
    autosystem = AutoSystem(ford)
    autosystem.car_run()
    autosystem.car_turn()
    autosystem.car_stop()
    autosystem.car = buick
    print("*" * 100)
    autosystem.car_run()
    autosystem.car_turn()
    autosystem.car_stop()
    print("*" * 100)
    autosystem.car = cadillac
    autosystem.car_run()
    autosystem.car_turn()
    autosystem.car_stop()
